/**
* \file		Action.h
* \brief	Définit la structure Action
* \details	C'est ici que sont définis la structure Action, ses
*		accesseurs, ses mutateurs et ses fonctions diverses.
*/

#ifndef ACTION_H
#define ACTION_H

#include "Entrepot.h"
#include "Carte.h"

/**
* \brief	Informations définissant une Action
* \details	Cette structure comporte le nom de l'action, le nom de sa
*		représentation et un pointeur sur la fonction liée à cette
*		action.
*/
struct sAction
{
   char *nomAction;			/*!< Nom de l'action : chaîne de
*					caractères */
   void (*pFAct)(Entrepot *, Carte *, int, unsigned int, unsigned int, unsigned int);/*!< Pointeur sur la fonction liée à l'action, comportant les arguments suivant : un pointeur sur l'entrepôt du clan, un pointeur sur la carte du jeu, un entier pour faire varier la production de la case, les trois entiers x,y,z de coordonnées du personnage */
   char *representation;		/*!< Nom de l'image correspondant à
*					l'action : chaîne de caractères */
   struct sAction *actionSuivante;	/*!< Action suivant l'action en cours*/
};

typedef struct sAction Action;


/*======================== Gestion de la mémoire =======================*/
/**
* \brief	Initialise une structure Action
* \details	Met à NULL tous les pointeurs
* \param	pact		Pointeur vers l'Action à initialiser
*/
void initAction(Action *pact);

/**
* \brief	Crée une Action
* \details	Crée une Action et l'initialise grâce à initAction.
* \param	pnouvAct	pointeur sur l'adresse de l'Action à créer
*/
void creerAction(Action **pnouvAct);

/**
* \brief	Libère la mémoire allouée aux champs de l'action donnée
* \details	Met à NULL tous les Pointeurs, désalloue la mémoire réservée
*		initialement pour les tableaux de char
* \param	pact		Pointeur vers l'action à libérer
*/
void libereAction(Action *pact);

/**
* \brief	Libère la mémoire allouée pour une Action donnée
* \param	pact		Pointeur vers l'action à détruire
*/
void detruireAction(Action *pact);

/*============================= Accesseurs =============================*/
/**
* \brief	Retourne le nom d'une Action donnée
* \return	Une chaîne de caractères
* \param	pact		Pointeur vers une action
*/
char *getNomAction(const Action *pact);

/**
* \brief	Retourne le pointeur vers une fonction d'une action donnée
* \return	Un pointeur sur fonction
* \param	pact		Pointeur vers une action
*/
void (*getFonctionAction(const Action *pact)) (Entrepot *, Carte *, int, unsigned int, unsigned int, unsigned int);

/**
* \brief	Retourne le nom de l'image permettant de représenter l'action
*		donnée
* \return	Une chaîne de caractères
* \param	pact		Pointeur vers une action
*/
char *getRepresentationAction(const Action *pact);

/**
* \brief	Retourne un pointeur vers l'action suivante d'une action donnée
* \return	Un pointeur vers action
* \param	pact		Pointeur vers une action
*/
Action *getActionSuivanteAction(const Action *pact);

/*============================== Mutateurs =============================*/
/**
* \brief	Remplace le nom d'une Action donnée par un nouveau nom
* \param	pact		Pointeur vers une action
* \param	nouvNom		Nom, chaîne de caractères
*/
void setNomAction(Action *pact, char *nouvNom);

/**
* \brief	Remplace le pointeur sur fonction d'une action donnée par un
*		nouveau pointeur sur fonction passé en paramètre
* \param	pact		Pointeur vers une action
* \param	pFAct		Pointeur vers une fonction
*/
void setFonctionAction(Action *pact, void (*pFAct)(Entrepot *, Carte *, int, unsigned int, unsigned int, unsigned int));

/**
* \brief	Remplace le nom de la représentation d'une Action donnée par
*		un nouveau nom
* \param	pact		Pointeur vers une action
* \param	nouvRepres	Nom, chaîne de caractères
*/
void setRepresentationAction(Action *pact, char *nouvRepres);

/**
* \brief	Remplace le contenu du champ actionSuivante d'une Action
*		donnée par un pointeur vers action passé en paramètre
* \param	pact		Pointeur vers une action
* \param	pactSuiv	Pointeur vers la nouvelle action suivante
*/
void setActionSuivanteAction(Action *pact, Action *pactSuiv);

/*===================== Jouer la fonction du champ =====================*/
/**
* \brief	Execute la fonction pointée par le champ pFAct d'une action
*		donnée
* \param	pact		Pointeur vers une action
* \param	pstock		Pointeur sur l'entrepôt du clan
* \param	pcarte		Pointeur sur la carte du jeu
* \param	modif		Entier, de combien on incrémente la Production
*				de la case
* \param	x		Entier non signé, coordonnée x de la case où
*				se situe l'action
* \param	y		Entier non signé, coordonnée y de la case où
*				se situe l'action
* \param	z		Entier non signé, coordonnée z de la case où
*				se situe l'action
*/
void executeFonctionAction(Action *pact, Entrepot *pstock, Carte *pcarte, int modif, unsigned int x, unsigned int y, unsigned int z);


/*============================ Les fonctions ============================*/

/**
* \brief	Fonction décrivant l'inaction d'un nain
* \details	Pour l'heure, ne fait rien. Mais par la suite, qui sait ?
* \param	pstock		Pointeur sur l'entrepôt du clan
* \param	pcarte		Pointeur sur la carte du jeu
* \param	modif		Entier, de combien on incrémente la Production
*				de la case
* \param	x		Entier non signé, coordonnée x de la case où
*				se situe l'action
* \param	y		Entier non signé, coordonnée y de la case où
*				se situe l'action
* \param	z		Entier non signé, coordonnée z de la case où
*				se situe l'action
*/
void inactif(Entrepot *pstock, Carte *pcarte, int modif, unsigned int x, unsigned int y, unsigned int z);

/**
* \brief	Fonction décrivant l'action de récolte de bois
* \details	Pour l'heure, ne fait rien. Mais par la suite, qui sait ?
* \param	pstock		Pointeur sur l'entrepôt du clan
* \param	pcarte		Pointeur sur la carte du jeu
* \param	modif		Entier, de combien on incrémente la Production
*				de la case
* \param	x		Entier non signé, coordonnée x de la case où
*				se situe l'action
* \param	y		Entier non signé, coordonnée y de la case où
*				se situe l'action
* \param	z		Entier non signé, coordonnée z de la case où
*				se situe l'action
*/
void recolteBois(Entrepot *pstock, Carte *pcarte, int modif, unsigned int x, unsigned int y, unsigned int z);

/**
* \brief	Fonction décrivant l'action de fin de récolte de bois
* \details	Incrémente de la valeur modif le stock de bois de l'entrepôt,
*		puis remet le pourcentage de production à zéro
* \param	pstock		Pointeur sur l'entrepôt du clan
* \param	pcarte		Pointeur sur la carte du jeu
* \param	modif		Entier, de combien on incrémente le stock de
*				bois de l'entrepôt
* \param	x		Entier non signé, coordonnée x de la case où
*				se situe l'action
* \param	y		Entier non signé, coordonnée y de la case où
*				se situe l'action
* \param	z		Entier non signé, coordonnée z de la case où
*				se situe l'action
*/
void finRecolteBois(Entrepot *pstock, Carte *pcarte, int modif, unsigned int x, unsigned int y, unsigned int z);


/**
* \brief	Fonction décrivant l'action de récolte de metal
* \details	Pour l'heure, ne fait rien. Mais par la suite, qui sait ?
* \param	pstock		Pointeur sur l'entrepôt du clan
* \param	pcarte		Pointeur sur la carte du jeu
* \param	modif		Entier, de combien on incrémente la Production
*				de la case
* \param	x		Entier non signé, coordonnée x de la case où
*				se situe l'action
* \param	y		Entier non signé, coordonnée y de la case où
*				se situe l'action
* \param	z		Entier non signé, coordonnée z de la case où
*				se situe l'action
*/
void recolteMetal(Entrepot *pstock, Carte *pcarte, int modif, unsigned int x, unsigned int y, unsigned int z);

/**
* \brief	Fonction décrivant l'action de fin de récolte de métal
* \details	Incrémente de la valeur modif le stock de métal de l'entrepôt,
*		puis remet le pourcentage de production de la case à zéro
* \param	pstock		Pointeur sur l'entrepôt du clan
* \param	pcarte		Pointeur sur la carte du jeu
* \param	modif		Entier, de combien on incrémente le stock de
*				bois de l'entrepôt
* \param	x		Entier non signé, coordonnée x de la case où
*				se situe l'action
* \param	y		Entier non signé, coordonnée y de la case où
*				se situe l'action
* \param	z		Entier non signé, coordonnée z de la case où
*				se situe l'action
*/
void finRecolteMetal(Entrepot *pstock, Carte *pcarte, int modif, unsigned int x, unsigned int y, unsigned int z);


/*========================== Fonctions autres ==========================*/
/**
* \brief	Crée une Action à partir des données fournies et renvoie un
*		pointeur pointant dessus
* \return	Un pointeur vers la nouvelle Action
* \param	nom		Nom de l'action, chaîne de caractères
* \param	repres		Nom de l'image représentant l'action, chaîne
*				de caractères
* \param	pFact		Pointeur sur la fonction à lier à l'action
*/
Action *creerCompleteAction(char *nom, char *repres, void (*pFAct)(Entrepot *, Carte *, int, unsigned int, unsigned int, unsigned int));

/*========================== Fonction de Test ==========================*/
/**
* \brief	Teste les différentes fonctions du module Action
* \details	Teste les différentes fonctions du module Action en les
*		utilisant avec diverses valeurs plus ou moins probables
*/
void testAction();


#endif
